function Cykl_out = mergeAll( Cykl1, Cykl2, WeightMatrix, DemandMatrix )
% vratime pokud mozno nejlepsi zmergovani techto 2 danych cyklu

Cykl_out = Cykl1; % TODO : ?

%upravit, aby oba cykly mely spravne orientovane demand edges
Cykl1 = upravOrientace( Cykl1 );
Cykl2 = upravOrientace( Cykl2 );


%Cykl2_otocenej
Cykl2_otocenej = Cykl2;
Cykl2_otocenej.route = fliplr(Cykl2_otocenej.route);
Cykl2_otocenej = upravOrientace( Cykl2_otocenej );


ic1 = 1;
ic2 = 1;

VC1(ic1) = Cykl1;
ic1 = ic1 + 1;

VC2(ic2) = Cykl2;
ic2 = ic2 + 1;
VC2(ic2) = Cykl2_otocenej;
ic2 = ic2 + 1;

% permutace demand egdes, pro Cykl1
for i=1:size( Cykl1.edges, 1 )
   
    %pokud existuje stejna hrana v obracenem poradi, pridame instanci do VC
    for j=1:length(Cykl1.route)-1
       
        if ( (Cykl1.route(1, j) == Cykl1.edges(i, 2)) && (Cykl1.route(1, j+1) == Cykl1.edges(i, 1)) )
           
            nc = Cykl1;
            %swap
            pom = nc.edges(i, 1);
            nc.edges(i, 1) = nc.edges(i, 2);
            nc.edges(i, 2) = pom;
            
            VC1(ic1) = nc;
            ic1 = ic1 + 1;                    
        end
    
    end
    
end


% permutace demand egdes, pro Cykl2 <- duplicitni
for i=1:size( Cykl2.edges, 1 )
   
    %pokud existuje stejna hrana v obracenem poradi, pridame instanci do VC
    for j=1:length(Cykl2.route)-1
       
        if ( (Cykl2.route(1, j) == Cykl2.edges(i, 2)) && (Cykl2.route(1, j+1) == Cykl2.edges(i, 1)) )
           
            nc = Cykl2;
            %swap
            pom = nc.edges(i, 1);
            nc.edges(i, 1) = nc.edges(i, 2);
            nc.edges(i, 2) = pom;
            
            VC2(ic2) = nc;
            ic2 = ic2 + 1;                    
        end
    
    end
    
end


% --- merging ---

im = 1;

for i=1:length(VC1)
    
   for j=1:length(VC2)
       
        tmp_c = mergeA( VC1(i), VC2(j), WeightMatrix, DemandMatrix);
        if ( tmp_c.demand == VC1(i).demand + VC2(j).demand )
            
             MergedCycles(im) = tmp_c;
             im = im + 1;
        end
        
        tmp_c = mergeCycles( VC1(i), VC2(j), WeightMatrix, DemandMatrix );
        if ( tmp_c.demand == VC1(i).demand + VC2(j).demand )
            
             MergedCycles(im) = tmp_c;
             im = im + 1;
        end    
       
   end
   
end


if ( ~exist('MergedCycles') )
    return
end

% vybereme tedka ten cykl, kterej je nejlevnejsi
[unused, order] = sort([MergedCycles(:).cost]);
MergedCycles = MergedCycles( order ); 

Cykl_out = MergedCycles(1); % return value

end

